import asyncio
import base64

import dashscope
from flask import Flask
from openai import OpenAI

app = Flask(__name__)

# 视觉识别客户端
vision_client = OpenAI(
    api_key="you-key",
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)

# 文本处理客户端
lan_client = OpenAI(
    api_key="you-key1",
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)

global_system_text = """
        请识别图片中的内容，列出主要物体的名称及其特征（例如颜色、大小、位置）。如果有文字内容，请提取并提供文本。
        如果场景涉及特定情绪，请描述情绪氛围。以简洁的段落形式返回结果。
        返回结果一定要以：“当前图片展示了”开头。
        """


def ai_understand_image(image_base64):
    completion = vision_client.chat.completions.create(
        model="qwen-vl-max-latest",
        messages=[
            {
                "role": "user",
                "content": [
                    {
                        "type": "image_url",
                        "image_url": {"url": f"data:image/jpeg;base64,{image_base64}"},
                    },
                    {"type": "text", "text": global_system_text},
                ],
            }
        ],
    )
    return completion.choices[0].message.content


async def async_ai_call(param):
    loop = asyncio.get_event_loop()
    # 在线程池中运行同步调用
    return await loop.run_in_executor(None, ai_understand_image, param)


#  base 64 编码格式
def encode_image(image_path):
    with open(image_path, "rb") as image_file:
        return base64.b64encode(image_file.read()).decode("utf-8")


def query_story(content):
    msg = """你是一位博学的导游，专注于向游客讲解当前看到的景点。 你现在带领了一群游客参观眼前的景点。 请给游客们介绍当前景点，并且与游客互动。 内容控制在150字以内。 参考以下示例： 
    示例1：女士们、先生们，欢迎大家参观故宫博物院。故宫，始建于明永乐四年，历时14年建成，是明清两代24位皇帝的皇宫，也是全球最大、保存最完整的古代宫殿建筑群。1987年，故宫被列为世界文化遗产。 
    “紫禁城”这一名称来源于古代天文学和民间传说，象征着皇帝是天帝之子，地位尊贵，禁地严密。故宫的建筑色调以红黄为主，寓意吉祥和富贵。它占地72万平方米，拥有9900多间宫殿，城墙高9.9米，四角有精美的角楼。 
    作为中国古代建筑的经典之作，故宫不仅体现了独特的建筑艺术，也是中国文化的重要象征。 
    示例2：欢迎来到我们的家！这里充满了温馨与回忆，每个角落都藏着我们的故事。尽管不大，但每一处都被精心布置，承载着我们的欢笑与温情。厨房里飘来的饭香，客厅里轻松的氛围，都让这里成为我们最放松的地方。无论是窗外的阳光，还是墙上的照片，都是我们共同生活的见证。在这里，我们分享快乐与挑战，迎接每一个新的一天。希望你能感受到这份家的温暖，像回到自己家一样，享受这片宁静与舒适。
    示例3：欢迎来到我们的办公室！这里是我们团队共同努力的空间，承载着无数创意与思考。作为一个充满活力与专业精神的工作环境，每一处都体现了我们对高效、创新的追求。办公室的设计简洁而现代，提供了一个舒适且富有活力的工作氛围。无论是开放式的工作区，还是私密的会议室，都为团队协作与个人专注提供了良好的条件。在这里，我们共同迎接每一个挑战，不断提升与创新。希望您在此感受到我们的团队文化与精神，并享受这段工作时光。"""
    result = call_ai_lan(msg, content)
    return result


def call_ai_images(images):
    """
    视觉模型调用
    """
    content = [{'image': get_base64_str(base64_image)} for base64_image in images]
    content.append({'text': global_system_text})
    messages = [
        {
            "role": "user",
            "content": content
        }
    ]
    response = dashscope.MultiModalConversation.call(
        api_key="sk-0bf516a642854b2b80288f7b82da2661",
        model='qwen-vl-max',
        messages=messages
    )
    print(response)
    return response


def get_base64_str(img_str):
    return f"data:image/jpeg;base64,{img_str}"


def call_ai_lan(role, content):
    """
    语言模型调用
    """
    completion = lan_client.chat.completions.create(
        model="qwen-plus",
        messages=[
            {'role': 'system', 'content': role},
            {'role': "user", 'content': content}
        ]
    )
    print(completion.choices[0].message.content)
    return completion.choices[0].message.content
